
#include "s3c2440_soc.h"

/* 115200,8n1 */
void uart0_init(void)
{
    /* 设置引脚用于串口 */
    /* GPH2,3用于TxD0, RxD0 */
    GPHCON &= ~((3 << 4) | (3 << 6));
    GPHCON |= ((2 << 4) | (2 << 6));

    GPHUP &= ~((1 << 2) | (1 << 3)); /* 使能内部上拉 */

    /* PCLK,中断/查询模式 */
    UCON0 = 0x00000005;

    /* 设置波特率 */
    /* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
	 */
    UBRDIV0 = 26;

    /* 设置数据格式 */
    ULCON0 = 0x00000003;
}

int putchar(unsigned char c)
{
    while (!(UTRSTAT0 & (1 << 2)))
        ;
    UTXH0 = c;
}

int getchar(void)
{
    while (!(UTRSTAT0 & (1 << 0)))
        ;
    return URXH0;
}

int puts(const char *s)
{
    while (*s)
    {
        putchar(*s);
        s++;
    }
}

/**
 * 1、 先初始化串口
 * 2、 循环获取用于输入的数据，然后回显
 */
int main(void)
{
    uart0_init();
    puts("Hello World!\r\n");

    unsigned char c;

    while (1)
    {
        c = getchar();

        if (c == '\n')
        {
            putchar('\r');
        }

        if (c == '\r')
        {
            putchar('\n');
        }

        putchar(c);
    }

    return 0;
}